這是一個打不贏就加入的故事
爬蟲的時候,一定很容易遇到網頁擋住自動爬蟲。因為因為爬蟲會消耗大量的網路流量,使真正的使用者可能無法正常訪問到網站。這時候,user-agent白名單跟校驗referer就成了很有效的防爬蟲手段
為什麼不能用程式自帶的user-agents呢?因為語言會自動幫request加上這是哪些code的header
Ex python default header
>>> import request
>>> requests.utils.default_headers()
{'User-Agent': 'python-requests/2.28.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
這時候就需要另外設定user-agent去覆蓋掉原本的User-Agent
ie:
‘Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; chromeframe/12.0.742.112)’
google:
‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36’
firefox:
‘Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:23.0) Gecko/20131011 Firefox/23.0’
safari:
‘Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4
設定user-agent
# 偽裝成google瀏覽器
user_grant = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36'
headers = {'user-agent': user_grant}
request.get(url, headers = headers)
這個時候就發現一個問題
為什麼每個瀏覽器的開頭都是Mozilla?而且後面的like Gecko是什麼意思?
1980年代,Tim Berners-Lee提出基於Unix的伺服器與瀏覽器原型,建立統一的URL、HTTP、HTML標準
1990年代,網路發展大爆發,Tim Berners-Lee在NeXT工作站建立一套圖型化介面瀏覽器,同年聖誕節,基於HTML和HTTP,WorldWideWeb誕生。
1991年8月,WorldWideWeb出現在公眾的視野。
圖片、影片、音頻等多媒體在這個時候還是以單獨的視窗存在,使用者點選連結後跳出多媒體視窗
1993年,網路發展大爆發,Andreessen釋出了Mosaic瀏覽器。世界上第一個大眾化的瀏覽器NCSA Mosaic亮相,並把自己稱作NCSA_Mosaic/2.0 (Windows 3.1),加入了標籤,同時也是通訊協定如FTP、NNTP、Gopher的客戶端。
Mosaic鼓勵所有使用者將他們的檔案傳送到網路上,包括圖片、影片、音頻。如此直覺如此直覺得形式使Mosaic在發布的18個月裡引發了網路歷史上前所未有的商機與活力
隔年1994年,Andreessent創辦了Netscape,並釋出了Netscape Navigator,並認為自己是Mozilla(Mosaic killer),並把自己稱作Mozilla/1.0 (Windows 3.1),因為該公司的目標就是打倒Mosaic成為世界排名第一的網路伺服器
想當然爾,Mosaic很不爽
接下來更好玩了Netscape支援框架,但是Mosaic沒有。後來大家開始使用框架了。於是user-agent出現了,只要是Mozilla就給支援框架的網頁,其他瀏覽器則提供不支援的網頁。
1994年10月,在Netscape發布的4個多月內,已達全球75%的市佔率。此時Microsoft已受到威脅
1995年,此時Mosaic的公司Spyglass跟Netscape兩大公司正強烈競爭中,Microsoft向Spyglass買下舊版Mosaic瀏覽器,稍加收改後,稱為Internet Explorer,也就是我們熟知的IE,希望他能成為Netscape killer。但是再怎麼說Internet Explorer還是以Mosaic作修改,user-agent還是把Internet Explorer導向了不支援框架的瀏覽器
這時候Microsoft慢慢意識到了問題,不在寄望於網路管理員認識IE並給他發框架
於是,Microsoft宣稱自己是”兼容Mozilla的”,並開始模仿Netscape,把自己稱為Mozilla/1.22 (compatible; MSIE 2.0; Windows 95),這樣Internet Explorer也能是可使用框架的瀏覽器了,算是Microsoft的大勝利。(從此開始了瀏覽器大混亂序曲)
此時,網站管理員已經分不太出來Internet Explorer跟Netscape了
此時已經變成Microsoft跟Netscape的瀏覽器大戰,雙方都盡可能地想以更快更好的產品搶下市占率。
Netscape推出了JavaScript,從此網站擁有了以往未曾有過的強大的運算能力。Microsoft一方則從一開始的反對到加入(CSS)。
1997年,Microsoft發行Internet Explorer4.0。Microsoft團隊製作一個大大的字母’e’並放置在Netscape總部的草坪上,Netscape團隊立刻敲碎的這個巨大的字母並將Mozilla吉祥物-恐龍放在上面。此時,情況已經走向了失控。來源:Mozilla官網
早期的Mozilla吉祥物
現代化的Mozilla吉祥物
嗯…當初是放哪個吉祥物呢
Microsoft逆向設定JavaScript,創造JScript,成為第一個可以跟Netscape相抗衡的瀏覽器IE 3。但IE 3 用了一些Spyglass的技術,於是被法院判決必須賠償Spyglass 800萬美元,是當初買下Mosaic瀏覽器金額的4倍。
虧錢了怎麼辦,於是Microsoft開了一個大絕-壟斷市場
Microsoft把Internet Explorer跟Windows捆綁銷售,此時Netscape無力對抗Microsoft的免費程式行銷策略,Netscape嘗試在瀏覽器增加更多功能,但使用者對於過多功能一事對於Netscape越來越反感。使Netscape於1998年底被徹底擊敗。
此時,Internet Explorer開始統攬瀏覽器市場,市占率最高峰市佔率最高峰達到了1999年的99%。比Netscape在最高峰的時候還要更高。
當然,Microsoft也被起訴,被控以非法手段壟斷Netscape市場地位與瀏覽器市場。
這時候的Netscape已面臨解散,利潤從5200萬美金跳水成1200萬美金,從此Netscape再也沒有辦法翻身
此時的Netscape已經意識到壟斷市場對於網路、瀏覽器、使用者來說並不是最佳利益的時候,Netscape決定把決定把程式碼完全公開,並重新打造了Gecko Rendering Engine,稱為Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826。並開發了Firefox瀏覽器,稱為Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0。
Rendering Engine決定了瀏覽器如何顯示網頁的內容以及頁面的格式訊息
Internet Explorer採用Trident,由於Internet Explorer的壟斷性,Trident內核長期處於一家獨大,於是乎,Trident漸漸的與W3C標準脫節(2005),Trident本身還有大量的bug與安全性問題(後門、按鍵記錄)待解決,引起了microsoft一部份開發人員不滿,於是他們與已停止更新的Netscape的部分員工一起開發了Mozilla,並以Mosaic內核為基礎重新開發了Gecko。
後來因為Internet Explorer安全性已經引起了諸多關注,美國電腦安全事故協調中心及多間電腦安全公司也建議用家改用更安全的Firefox,以避開此等攻擊。
Firefox跟Gecko表現優秀,於是IE又被比下去了。如同Firefox威脅到了IE霸主地位,Gecko也改變了整了網路生態,最明顯的就是推動了代碼的標準化。使Mircosoft在威脅下不得不改進Trident內核。但是由於Gecko內核表現得比其他內核優秀太多,網路管理者開始了差別待遇,把設計良好的code送到Gecko,其他瀏覽器就沒有這個待遇了。(user-agent 2.0)
至此,Linux很傷心,他們創建了基於KHTML引擎支持的Konqueror,但並沒有被輸送到良好代碼。明明Konqueror跟Gecko一樣的優秀,但是網路管理者把網頁導向了較差code的那個address,於是,Konqueror開始偽裝成Gecko,稱自己為Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko),世界開始混亂 (始作俑者應該算是Microsoft)
後來出現了Opera,稱自己為Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51, Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51,Opera/9.51 (Windows NT 5.1; U; en)。意思很明顯,選誰就是誰,任挑任選。
Opera是一款非常優秀的瀏覽器,始終如一的優秀,但不一定優秀就是適合所有人
Opera在JavaScript引擎的最新版本的PK都是可以都是可以奪冠的
Apple開始搶佔Windows市場,於是開發了Safari,使用KHTML引擎。同時為了區別,增加了很多的特性(節能、更快更安全),後來另起了一個名字,叫做WebKit,但是他又想得到那些為了KHTML編寫的網頁,於是稱自己叫Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5。
之後Google也開始開發自己的瀏覽器Chrome,使用了WebKit內核。但是Chrome又想要得到為了Safari開發的網頁,於是叫自己為Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13。從此,Chrome簡潔明亮的畫面席捲了使用者對於瀏覽器的體驗。
最後chrome變成了自己是KHTML但是like Gecko,自己的瀏覽器也是Safari,從此瀏覽器混亂大爆發,每個人都宣稱自己是另一個人。
怎麼說呢,Miciosoft開啟了這個先河,於是其他人開始有樣學樣
2008年,Google發布基於WebKit和知名的V8但又更快的JavaScript引擎,極大幅度提升了JavaScript在瀏覽器的效能,促使Node.js等JavaScript runtime快速發展。
2022年7月Statcounter釋出了各大瀏覽器市占率
參考資料
https://www.wired.com/2010/04/0422mosaic-web-browser/
https://zh.wikipedia.org/wiki/Mosaic
https://cloud.tencent.com/developer/article/1398495
https://www.mozilla.org/zh-TW/firefox/browsers/browser-history/
https://3c.ltn.com.tw/news/17090
https://cloud.tencent.com/developer/article/1679303
https://new.qq.com/rain/a/20221005A04XXZ00
https://www.linuxjournal.com/article/6565
https://www.techbang.com/posts/98642-completed-microsoft-edges-pc-market-share-continues-to-climb
https://realdennis.medium.com/瀏覽器的戰爭與歷史-沒有參與上古戰爭的-chrome-卻幾乎一腳踢出大結局-bb43d51a6757
「至此,Linux很傷心,他們創建了基於KHTML引擎支持的Konqueror,但並沒有被輸送到良好代碼。明明Konqueror跟Gecko一樣的優秀,但是網路管理者把網頁導向了較差code的那個address」
網路管理者是誰?為什麼可以決定瀏覽器內容?
網路管理者就是網管人員,統稱MIS,如果沒有這個職缺通常混進Devops或是後端工程師裡面了
使用者發請求到伺服器端,網管人員可以依據伺服器端的請求得知使用者的user-agent(包含瀏覽器與渲染引擎),再決定導向哪個地址。大致流程是這樣。
所以是透過 web server (像是 apache 或 nginx) 導向決定的?
對的對的,web server可以做到網站的redirect
但因為後來各大瀏覽器的抗議(還有已經分不清楚誰是誰)跟mobile的興起,RWD就取代了之前依照瀏覽器派發不同address的功能。這個應該算是時代的眼淚的吧。
我的理解是這樣:server依據broswer request的user-agent,判斷回傳那個html檔,會有較佳的效能跟體驗。